package com.ads.proplan.control;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

import android.content.Context;

import com.ads.proplan.db.FaseRepository;
import com.ads.proplan.db.JogadorRepository;
import com.ads.proplan.db.PerguntaRepository;
import com.ads.proplan.db.SessaoPerguntaRepository;
import com.ads.proplan.db.TrofeuGanhoRepository;
import com.ads.proplan.db.TrofeuRepository;
import com.ads.proplan.db.UsuarioRepository;
import com.ads.proplan.db.entity.Fase;
import com.ads.proplan.db.entity.Jogador;
import com.ads.proplan.db.entity.Pergunta;
import com.ads.proplan.db.entity.SessaoPergunta;
import com.ads.proplan.db.entity.Trofeu;
import com.ads.proplan.db.entity.TrofeuGanho;
import com.ads.proplan.db.entity.Usuario;

public abstract class FaseControlAbstract {
	

//===========================================TABELAS=======================================================//	
	
	protected PerguntaRepository questionRepos;
	protected ArrayList<Pergunta> arrayListQuestions;
	protected Pergunta perguntaEntity;

	protected JogadorRepository jogadorRepos;
	protected ArrayList<Jogador> arrayListJogador;
	protected Jogador jogadorEntity;
	
	protected UsuarioRepository usuarioRepos;
	protected ArrayList<Usuario> arrayListUsuario;
	protected Usuario usuarioEntity;
	
	protected SessaoPerguntaRepository sessaoPerguntaRepos;
	protected ArrayList<SessaoPergunta> arrayListSessaoPergunta;
	protected SessaoPergunta sessaoPerguntaEntity;
	
	protected TrofeuGanhoRepository trofeuGanhoRepos;
	protected ArrayList<TrofeuGanho> arrayListTrofeuGanho;
	protected TrofeuGanho trofeuGanhoEntity;
	
	protected TrofeuRepository trofeuRepos;
	protected ArrayList<Trofeu> arrayListTrofeu;
	protected Trofeu trofeuEntity;
	
	protected FaseRepository faseRepos;
	protected ArrayList<Fase> arrayListFase;
	protected Fase faseEntity;
	
//=======================================ESTADOS============================================================//
		
	public abstract void restartControl();
	
	public abstract void closeControl();
	
	public abstract void initialControl(Context context);
	
	public abstract void finalizeControl();
	
//===========================================METODOS DE APOIO==============================================//

	protected void getListQuestionDb(Context context){
		if (questionRepos == null) {
			questionRepos = new PerguntaRepository(context);
			if (jogadorEntity.getFase() == 1) {
				arrayListQuestions = (ArrayList<Pergunta>) questionRepos.getAllFase1();
			}if (jogadorEntity.getFase() == 2) {
				arrayListQuestions = (ArrayList<Pergunta>) questionRepos.getAllFase2();
			}
			if (jogadorEntity.getFase() >= 3) {
				arrayListQuestions = (ArrayList<Pergunta>) questionRepos.getAllFase2();
			}
			mixList(arrayListQuestions);
		}
	}
	
	protected void getAllListQuestionDb(Context context){
		if (questionRepos == null) {
			questionRepos = new PerguntaRepository(context);
		}
		arrayListQuestions = (ArrayList<Pergunta>) questionRepos.getAll();
	}
	
	protected void getJogador(Context context) {
		if (jogadorRepos == null) {
			jogadorRepos = new JogadorRepository(context);
			arrayListJogador = (ArrayList<Jogador>) jogadorRepos.getAll();
			jogadorEntity = arrayListJogador.get(0);
		}
	}
	
	protected void getUsuario(Context context) {
		if (usuarioRepos == null) {
			usuarioRepos = new UsuarioRepository(context);
			arrayListUsuario = (ArrayList<Usuario>) usuarioRepos.getAll();
			usuarioEntity = arrayListUsuario.get(0);
		}
	}
	
	protected void getListSessaoPergunta(Context context) {
		if (sessaoPerguntaRepos == null) {
			sessaoPerguntaRepos = new SessaoPerguntaRepository(context);
		}
		arrayListSessaoPergunta = (ArrayList<SessaoPergunta>) sessaoPerguntaRepos.getAll();
	}
	
	
	protected void getFase(Context context) {
		if (faseRepos == null) {
			faseRepos = new FaseRepository(context);
			arrayListFase = (ArrayList<Fase>) faseRepos.getAll();
		}
	}
	

	public int getFaseQuestionForID(int id){
		int fase = 1;
		for (Pergunta pergunta : arrayListQuestions) {
			if(pergunta.getId() == id){
				fase = pergunta.getFase();
				return fase;
			}
		}
		return fase;
	}
	
//===========================================SUBMETODOS LOGICOS==============================================//	

	protected void mixList(List lista) {
		long seed = System.nanoTime();
		Collections.shuffle(lista, new Random(seed));
	}
	
	public void QuestionResolvedClean() {
		for (int i = 0; i < arrayListQuestions.size(); i++) {
			arrayListQuestions.get(i).setRespondida(0);
			//TODO Verificar e Testar essa parte
			questionRepos.update(arrayListQuestions.get(i));
		}
	}

	public void setEstadoFase(int fase, int estado) {
		faseEntity = arrayListFase.get(fase-1);
		faseEntity.setEstadoPersonagem(estado);
		faseRepos.update(faseEntity);
	}

//===========================================GET AND SET==================================================//	
	

	public Jogador getJogadorEntity() {
		return jogadorEntity;
	}
		
	public Usuario getUsuarioEntity() {
		return usuarioEntity;
	}

	public TrofeuGanho getTrofeuGanhoEntity() {
		return trofeuGanhoEntity;
	}

	public Trofeu getTrofeuEntity() {
		return trofeuEntity;
	}
	
	public int getJumpNumber(){
		return jogadorEntity.getPulos();
	}
	
	public void setJumpNumber(int pulos){
		jogadorEntity.setPulos(pulos);
	}
	
	public int getLifeNumber() {
		return jogadorEntity.getVidas();
	}
	
	public void setLifeNumber(int life) {
		jogadorEntity.setVidas(life);
	}
	
	public int getBarMaxSize() {
		return arrayListFase.get(jogadorEntity.getFase()-1).getTempo();
	}
		
	public int getQuestionCorrectNumber(){
		return jogadorEntity.getQCorretaRodada();
	}
	
	public int getNumberQuestionsStage(){
		return (arrayListFase.get(jogadorEntity.getFase()-1).getNumeroPerguntas());
	}
	
	public int getQuestionNumber(){
		return jogadorEntity.getQRodada();
	}
	
	public ArrayList<SessaoPergunta> getNewListSessaoPergunta() {
		return arrayListSessaoPergunta = (ArrayList<SessaoPergunta>) sessaoPerguntaRepos.getAll();

	}
	
}
